home *** CD-ROM | disk | FTP | other *** search
/ MacFormat España 15 / macformat_15.iso / C de cerca / Codewarrior Lite / MacOS Support / Headers / ANSI Headers / bitstring < prev    next >
Text File  |  1995-12-29  |  4KB  |  145 lines

  1. // bitstring standard header
  2. #ifndef _BITSTRING_
  3. #define _BITSTRING_
  4. #include <string>
  5.  
  6. #if __MWERKS__
  7. #pragma options align=mac68k
  8.  
  9. #if __CFM68K__ && __USING_IMPORTED_ANSI__
  10. #pragma import on
  11. #endif
  12. #endif
  13.  
  14.         // class bitstring
  15. string _Bitsxstr(istream&, size_t);
  16. class bitstring {
  17. public:
  18.     typedef unsigned long _T;
  19.     enum {_Nb = _BITS_BYTE * sizeof (_T)};
  20.     enum _Source {_Zeros = 0, _Ones = -1};
  21.     bitstring()
  22.         {_Tidy(); }
  23.     bitstring(unsigned long, size_t);
  24.     bitstring(const bitstring& _X, size_t _P = 0,
  25.         size_t _N = NPOS)
  26.         {_Tidy(), assign(_X, _P, _N); }
  27.     bitstring(const string&, size_t = 0, size_t = NPOS);
  28.     bitstring(_Source _S)
  29.         : _Ptr(0), _Src(_S), _Len(0), _Res(0) {}
  30.     ~bitstring()
  31.         {_Tidy(1); }
  32.     bitstring& operator=(const bitstring& _R)
  33.         {return (assign(_R)); }
  34.     bitstring& operator+=(const bitstring& _R)
  35.         {return (append(_R)); }
  36.     bitstring& operator&=(const bitstring&);
  37.     bitstring& operator|=(const bitstring&);
  38.     bitstring& operator^=(const bitstring&);
  39.     bitstring& operator<<=(size_t);
  40.     bitstring& operator>>=(size_t);
  41.     bitstring& append(const bitstring&, size_t = 0,
  42.         size_t = NPOS);
  43.     bitstring& assign(const bitstring&, size_t = 0,
  44.         size_t = NPOS);
  45.     bitstring& insert(size_t, const bitstring&, size_t = 0,
  46.         size_t = NPOS);
  47.     bitstring& remove(size_t = 0, size_t = NPOS);
  48.     bitstring& replace(size_t, size_t, const bitstring&,
  49.         size_t = 0, size_t = NPOS);
  50.     bitstring& set();
  51.     bitstring& set(size_t, _Bool = 1);
  52.     bitstring& reset();
  53.     bitstring& reset(size_t _P)
  54.         {return (set(_P, 0)); }
  55.     bitstring& toggle();
  56.     bitstring& toggle(size_t);
  57.     string to_string() const;
  58.     size_t count() const;
  59.     size_t length() const
  60.         {return (_Len); }
  61.     size_t resize(size_t, _Bool = 0);
  62.     size_t trim()
  63.         {resize(rfind(1) + 1);
  64.         return (_Len); }
  65.     size_t find(_Bool, size_t = 0, size_t = NPOS) const;
  66.     size_t rfind(_Bool, size_t = 0, size_t = NPOS) const;
  67.     bitstring substr(size_t _P, size_t _N = NPOS) const
  68.         {return (bitstring(*this, _P, _N)); }
  69.     _Bool operator==(const bitstring&) const;
  70.     _Bool operator!=(const bitstring& _R) const
  71.         {return (!(*this == _R)); }
  72.     _Bool test(size_t) const;
  73.     _Bool any() const;
  74.     _Bool none() const
  75.         {return (!any()); }
  76.     bitstring operator<<(size_t _R) const
  77.         {return (bitstring(*this) <<= _R); }
  78.     bitstring operator>>(size_t _R) const
  79.         {return (bitstring(*this) >>= _R); }
  80.     bitstring operator~() const
  81.         {return (bitstring(*this).toggle()); }
  82.     _T _W(int _I) const
  83.         {return (_Ptr[_I]); }
  84.     _T _X(int _I, int _P) const
  85.         {int _L = _Len == 0 ? -1 : (_Len - 1) / _Nb;
  86.         return (_L < _I ?  _Src : _P == 0 ? _Ptr[_I]
  87.             : _L == _I ? _Ptr[_I] << _P
  88.             : _Ptr[_I] << _P | _Ptr[_I + 1] >> _Nb - _P); }
  89. private:
  90.     void _Copylr(const bitstring&, size_t, size_t, size_t);
  91.     void _Copyrl(const bitstring&, size_t, size_t, size_t);
  92.     _Bool _Grow(size_t, _Bool = 0);
  93.     void _Setl(size_t _L)
  94.         {_Len = _L, _L %= _Nb;
  95.         if (_L != 0)
  96.             _Ptr[(_Len - 1) / _Nb] &= ~(~(_T)0 >> _L); }
  97.     void _Tidy(_Bool = 0);
  98.     void _Xinv() const
  99.         {invalidargument("invalid bitstring char").raise(); }
  100.     void _Xlen() const
  101.         {lengtherror("bitstring too long").raise(); }
  102.     void _Xran() const
  103.         {outofrange("invalid bitstring position").raise(); }
  104.     _T *_Ptr, _Src;
  105.     size_t _Len, _Res;
  106.     };
  107.         // operators
  108. inline bitstring operator+(const bitstring& _L,
  109.     const bitstring& _R)
  110.     {return (bitstring(_L) += _R); }
  111. inline bitstring operator&(const bitstring& _L,
  112.     const bitstring& _R)
  113.     {return (bitstring(_L) &= _R); }
  114. inline bitstring operator|(const bitstring& _L,
  115.     const bitstring& _R)
  116.     {return (bitstring(_L) |= _R); }
  117. inline bitstring operator^(const bitstring& _L,
  118.     const bitstring& _R)
  119.     {return (bitstring(_L) ^= _R); }
  120. inline istream& operator>>(istream& _I, bitstring& _R)
  121.     {_R = _Bitsxstr(_I, NPOS - 1);
  122.     return (_I); }
  123. inline ostream& operator<<(ostream& _O, const bitstring& _R)
  124.     {return (_O << _R.to_string()); }
  125.  
  126. #if __MWERKS__
  127. #if __CFM68K__ && __USING_IMPORTED_ANSI__
  128. #pragma import reset
  129. #endif
  130.  
  131. #pragma options align=reset
  132. #endif
  133.  
  134. #endif
  135.  
  136. /*
  137.  * Copyright (c) 1994 by P.J. Plauger.  ALL RIGHTS RESERVED. 
  138.  * Consult your license regarding permissions and restrictions.
  139.  */
  140.  
  141. /* Change log:
  142.  *94June04 PlumHall baseline
  143.  *94Oct07 Inserted MW changes.
  144.  */
  145.